Skip to main content

ES Modules支持

ES Modules 支持的关键版本

版本描述
v12.0.0首次实验性支持 ES Modules,需通过 --experimental-modules 标志启用。
v13.2.0默认支持 package.json"type": "module" 配置,允许项目级 ES Modules 自动启用。
v14.0.0改进 ES Modules 加载器(仍为实验性),支持 import/export 语法。
v16.0.0移除 --experimental-modules 标志,ES Modules 默认启用(基于 package.json 的配置)。
v18.0.0ES Modules 标记为稳定功能,完全移除实验性标志。

后缀名变化

  • Node.js 12+:初步支持 ESM,但需实验性标志
  • Node.js 13.2.0:引入 type: "module" 配置和 .mjs/.cjs 扩展名
  • Node.js 14.0.0+:默认启用 ESM,支持 .mjs.cjs 的显式模块类型
  • Node.js 18.0.0:ESM 标记为稳定功能,移除实验性标志
后缀名模块类型技术栈版本支持与引入历史主要用途与特性注意事项
.js动态解析Node.js所有版本均支持 默认解析规则由 package.jsontype 字段决定(module/commonjs- 无显式扩展名时,根据父级 type 字段判定模块类型 - 兼容旧版 CommonJS 项目混用 ESM 语法时需显式声明 .mjs 或配置 type: "module"
.mjsESMNode.jsNode.js 12.0.0 开始实验性支持 Node.js 14.0.0 后默认启用- 显式标记为 ES 模块 - 支持 import/export 语法 - 支持顶层 await浏览器和 Node.js 均兼容,但部分工具链(如 Webpack)需额外配置
.cjsCommonJSNode.jsNode.js 13.2.0 引入- 显式标记为 CommonJS 模块 - 兼容 require/module.exports 语法与 ESM 互操作时需使用动态 import()
.mtsESM (TS)TypeScriptTypeScript 4.5 引入- TypeScript 的 ESM 源码文件 - 编译为 .mjs - 支持严格的 ES 模块语法检查需配置 module: "nodenext"esnext
.ctsCommonJS (TS)TypeScriptTypeScript 4.5 引入- TypeScript 的 CommonJS 源码文件 - 编译为 .cjs - 兼容传统 require 语法混合项目需注意声明文件生成路径
.d.ts类型声明TypeScript所有版本均支持- 声明文件用于类型提示 - 可扩展第三方模块类型(通过声明合并或全局增强)需与源码文件同名或在 types 目录中
场景解决方案相关技术栈/工具
ESM 导入 CommonJS使用默认导入:import pkg from 'cjs-module.cjs' 或动态 import()Node.js ≥14.0.0, TypeScript ≥4.5
CommonJS 导入 ESM仅支持动态 import(),无法使用 requireNode.js ≥13.2.0
TS 编译为混合模块配置 tsconfig.jsonmodulemoduleResolution 字段(如 nodenextTypeScript ≥4.7
路径扩展名重写启用 --rewriteRelativeImportExtensions(TypeScript 5.7+)适用于直接运行 TS 的运行时(如 Bun、Deno)